﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using clBUS;
using clEntidad;
using System.IO;
using System.Drawing.Imaging;   // Para usar API

namespace portero_
{
    public partial class frmIngreso : Form
    {
        public String numDoc { get; set; }
        public frmIngreso()
        {
            InitializeComponent();
            numDoc = "";
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            BUSOpciones objBUS = new BUSOpciones(Constantes.CADENA_BD);
            Opciones opciones = objBUS.getAll();
            Foto.Text = "Fotografía (resol " + opciones.resolucionFoto.ToString() + ")";
            Capturar(Varios.CamHandle);
            tbApePat.CharacterCasing = CharacterCasing.Upper;
            tbApeMat.CharacterCasing = CharacterCasing.Upper;
            tbNombres.CharacterCasing = CharacterCasing.Upper;

            llenaElementos("empresa",cbEmpresa);
            llenaElementos("cargo", cbCargo);
            llenaElementos("visitado", cbVisitado);
            llenaElementos("ubicacion", cbUbicacion);
            llenaElementos("area", cbArea);
            if (numDoc != "")
            {
                tbNumDoc.Text = numDoc;
                buscar();
            }
        }
        private int  validaDemo()
        {
            BUSRegistro objBUS = new BUSRegistro(Constantes.CADENA_BD);
            int idLocal=0;
            int contador = 0;
            if (Constantes.LOCAL != null)
                idLocal = Constantes.LOCAL.id;
            DateTime fecha = DateTime.Now - DateTime.Now.TimeOfDay;
            List<Registro> elems = objBUS.getByFec(fecha, idLocal);
            foreach (Registro elem in elems)
            {
                if (!elem.salio)
                    contador++;
            }
            return contador;
        }
        /// <summary>
        /// Listará las cámaras web encontradas en el Combobox asociado
        /// </summary>
        public void Listar()
        {
            bool valor;
            String nombre = "".PadRight(100); ;
            String version = "".PadRight(100); ;
            int x = 0;
            do
            {
                valor = Varios.capGetDriverDescriptionA(x, ref nombre, 100, ref version, 100);
                if (valor)
                {
                    //comboBox1.Items.Add(nombre + " " + version);
                }

                x = x + 1;

            } while (!valor == false);
        }
        /// <summary>
        /// La WebCam se Encenderá y mostrará lo capturado en el PictureBox referenciado
        /// </summary>
        /// <param name="Dispositivo">Nº de dispositivo del Combobox</param>        
        public void Capturar(int Dispositivo)
        {

            try
            {

                //StopCaptura(); // Antes de nada "reseteo" el dispositivo  
                Varios.CamHandle = Varios.capCreateCaptureWindowA("XXXX" + Dispositivo.ToString(), 0, 0, 0, 0, 0, Pbx.Handle.ToInt32(), Dispositivo); // Obtengo el Handle de la cam
                Varios.SendMessage(Varios.CamHandle, Varios.WM_CAP_CONNECT, 0, 0); // Enciendo la cam
                Varios.SendMessage(Varios.CamHandle, Varios.WM_CAP_SET_PREVIEWRATE, 30, 0); // Establezco los frames de captura /seg
                Varios.SendMessage(Varios.CamHandle, Varios.WM_CAP_SET_PREVIEW, 0, 0); // Empiezo a capturar
                reloj.Start(); // Inicio la captura  
                camEncendido = true;
                btnStopCapture.Text = "Tomar Foto";
            }

            catch (Exception e)
            {
                MessageBox.Show("No se puede Iniciar la WebCam", "Error: " + e.Message );
            }

        }
        /// <summary>
        /// Detiene la captura de imágenes y apaga la WebCam
        /// </summary>
        public void StopCaptura()
        {


            try
            {
                reloj.Stop();
                Varios.SendMessage(Varios.CamHandle, Varios.WM_CAP_DISCONNECT, 0, 0); // Apago la cam
                Varios.EmptyClipboard(); // Vacío el portapapeles
                camEncendido = false;
                Varios.CamHandle = 0;
                btnStopCapture.Text = "Enceder camara";
            }

            catch (Exception e) {
                MessageBox.Show("Error: " + e.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Error);
            } 
        }

        private void btnCapturar_Click(object sender, EventArgs e)
        {
            Capturar(Varios.CamHandle);
        }

        private void reloj_Tick(object sender, EventArgs e)
        {
            Varios.SendMessage(Varios.CamHandle, Varios.WM_CAP_GET_FRAME, 0, 0); // Capturo la imagen
            Varios.SendMessage(Varios.CamHandle, Varios.WM_CAP_COPY, 0, 0); // La copio al portapeles
            Pbx.Image = Clipboard.GetImage(); // La mando al Picturebox
            Varios.EmptyClipboard(); // Vacío el portapapeles
        }
        private Boolean camEncendido;
        private void btnStopCapture_Click(object sender, EventArgs e)
        {
            if (camEncendido)
            {
                StopCaptura();
                tbNumDoc.Focus();
            }
            else
            {
                Capturar(Varios.CamHandle);
            }
        }

        private void Salir_Click(object sender, EventArgs e)
        {
            this.Close();
            StopCaptura();
        }

        private void btnAdd_Click(object sender, EventArgs e)
        {
            frmEquipo frmEqp = new frmEquipo();
            
            frmEqp.ShowDialog(this );
            if (frmEqp.equipo != null)
            {
                int numReg = dgvEquipos.Rows.Add();
                dgvEquipos.Rows[numReg].Cells["numserie"].Value = frmEqp.equipo.numSerie;
                dgvEquipos.Rows[numReg].Cells["tipo"].Value = frmEqp.equipo.tipo ;
                dgvEquipos.Rows[numReg].Cells["marca"].Value = frmEqp.equipo.marca ;
                dgvEquipos.Rows[numReg].Cells["modelo"].Value = frmEqp.equipo.modelo ;
            }
        }

        private void tbNumDoc_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 13)
                SendKeys.Send("{TAB}");
        }

        private void tbApePat_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 13)
                SendKeys.Send("{TAB}");
        }

        private void tbApeMat_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 13)
                SendKeys.Send("{TAB}");
        }

        private void tbNombres_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 13)
                SendKeys.Send("{TAB}");
        }

        private void Form1_Shown(object sender, EventArgs e)
        {
            tbNumDoc.Focus();
        }


        private void tsbSave_Click(object sender, EventArgs e)
        {
            /*
            if (validaDemo() >= 10)
            {
                MessageBox.Show("Versión de prueba, no se admite más de 10 ingresos sin salida por fecha",Constantes.cNOMBRE_SIS, MessageBoxButtons.OK ,  MessageBoxIcon.Stop);
                return;
            }
            DateTime limite = new DateTime(2013, 6, 2);
            if (DateTime.Today > limite)
            {
                MessageBox.Show("Error general");
                return;
            }*/
            BUSOpciones objBUS = new BUSOpciones(Constantes.CADENA_BD);
            Opciones opciones = objBUS.getAll();
            if (opciones.fotoObligatorio)
            {
                if (camEncendido)
                {
                    MessageBox.Show("Debe capturar la foto", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    return;
                }
            }
            if (tbNumDoc.Text.Trim().Equals(""))
            {
                MessageBox.Show("Debe ingresar nombre", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                tbNumDoc.Focus();
                return;
            }
            if (tbApePat.Text.Trim().Equals(""))
            {
                MessageBox.Show("Debe ingresar apellido paterno", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                tbApePat.Focus();
                return;
            }
            if (tbNombres.Text.Trim().Equals(""))
            {
                MessageBox.Show("Debe ingresar nombres", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                tbNombres.Focus();
                return;
            }
            int id = grabar(opciones);
            if (MessageBox.Show("Se grabó correctamente, ¿Desea imprimir pase?", Constantes.cNOMBRE_SIS, MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes)
            {
                frmPrint ofrmPrint = new frmPrint();
                ofrmPrint.id = id;
                ofrmPrint.printPreviewDialog1.Document = ofrmPrint.printDocument1;
                ofrmPrint.printPreviewDialog1.ShowDialog();
            }
            if (camEncendido )
                StopCaptura();
            this.Close();
            //limpiar();
        }
        /// <summary> 
        /// Returns the image codec with the given mime type 
        /// </summary> 
        private static ImageCodecInfo GetEncoderInfo(string mimeType)
        {
            // Get image codecs for all image formats 
            ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();

            // Find the correct image codec 
            for (int i = 0; i < codecs.Length; i++)
                if (codecs[i].MimeType == mimeType)
                    return codecs[i];
            return null;
        }

        private int grabar(Opciones opciones)
        {

            BUSRegistro objBUS = new BUSRegistro(Constantes.CADENA_BD);

            Registro registro = new Registro();

            if (!camEncendido)
            {
                MemoryStream ms = new MemoryStream();
                ImageCodecInfo jpegCodec = GetEncoderInfo("image/jpeg");
                EncoderParameter qualityParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)opciones.resolucionFoto );
                EncoderParameters encoderParams = new EncoderParameters(1);
                encoderParams.Param[0] = qualityParam;
                if (Pbx.Image != null)
                {
                    Pbx.Image.Save(ms, jpegCodec, encoderParams);

                    Byte[] bytBLOBData = new Byte[ms.Length];
                    ms.Position = 0;
                    ms.Read(bytBLOBData, 0, Convert.ToInt32(ms.Length));

                    registro.foto = bytBLOBData;
                }
            }

            Persona persona = new Persona();
            persona.numDoc = tbNumDoc.Text;
            persona.apePat = tbApePat.Text;
            persona.apeMat = tbApeMat.Text;
            persona.nombres = tbNombres.Text;
            persona.empresa = cbEmpresa.Text;
            persona.cargo = cbCargo.Text;
            registro.persona = persona;
            registro.NumeroPase = cbNumPase.Text;
            registro.persona.esVisita = ckbVisita.Checked; 
            registro.idLocal = Constantes.LOCAL.id;

            Visitado visitado = new Visitado();
            visitado.nombre = cbVisitado.Text;
            visitado.ubicacion = cbUbicacion.Text;
            visitado.area = cbArea.Text;
            registro.persona.visitado = visitado;

            foreach (DataGridViewRow row in dgvEquipos.Rows)
            {
                Equipo equipo = new Equipo();
                equipo.numSerie = (String ) row.Cells["numserie"].Value;
                equipo.tipo = (String)row.Cells["tipo"].Value;
                equipo.marca = (String)row.Cells["marca"].Value;
                equipo.modelo = (String)row.Cells["modelo"].Value;

                registro.equipos.Add(equipo);
            }
            return objBUS.grabar(registro, Constantes.USUARIO).id;
        }
        private void buscar()
        {
            BUSPersona objBUS = new BUSPersona(Constantes.CADENA_BD);
            BUSEquipo objBUSEqp = new BUSEquipo(Constantes.CADENA_BD);
            Persona persona = objBUS.get(tbNumDoc.Text.Trim());
            if (persona != null)
            {
                tbApePat.Text = persona.apePat;
                tbApeMat.Text = persona.apeMat;
                tbNombres.Text = persona.nombres;
                cbEmpresa.Text = persona.empresa;
                cbCargo.Text = persona.cargo;
                //ckbVisita.Checked = persona.esVisita;
                if (!persona.visitado.nombre.Equals(""))
                {
                    cbVisitado.Text = persona.visitado.nombre;
                    cbUbicacion.Text = persona.visitado.ubicacion;
                    cbArea.Text = persona.visitado.area;
                    ckbVisita.Checked = true;
                }
                else
                {
                    ckbVisita.Checked = false;
                    cbVisitado.Text = "";
                    cbUbicacion.Text = "";
                    cbArea.Text = "";
                }
                dgvEquipos.Rows.Clear();
                if (persona.ultimaVisita != 0)
                {
                    foreach (Equipo elem in  objBUSEqp.getByVisita(persona.ultimaVisita))
                    {
                        int numReg = dgvEquipos.Rows.Add();
                        dgvEquipos.Rows[numReg].Cells["numserie"].Value = elem.numSerie;
                        dgvEquipos.Rows[numReg].Cells["tipo"].Value = elem.tipo;
                        dgvEquipos.Rows[numReg].Cells["marca"].Value = elem.marca;
                        dgvEquipos.Rows[numReg].Cells["modelo"].Value = elem.modelo;
                    }

                }
            }

        }
        private void tbNumDoc_Validated(object sender, EventArgs e)
        {
            buscar();
        }
        private void llenaElementos(String elemento, ComboBox cb)
        {
            BUSBase objBUS = new BUSBase(Constantes.CADENA_BD);
            List<String> elems = objBUS.getElementos(elemento);
            AutoCompleteStringCollection data = new AutoCompleteStringCollection();
            foreach (String cadena in elems)
            {
                data.Add(cadena);
            }
            cb.AutoCompleteCustomSource = data;
        }


        private void dtDel_Click(object sender, EventArgs e)
        {
            if (dgvEquipos.SelectedRows.Count > 0)
            {
                foreach (DataGridViewRow row in dgvEquipos.SelectedRows)
                {
                    dgvEquipos.Rows.Remove(row);
                }
            }
            else
                MessageBox.Show("No hay equipos seleccionados", Constantes.cNOMBRE_SIS, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
        }


        private void Pbx_Click(object sender, EventArgs e)
        {
            //StopCaptura();
            //frmFoto ofrmFoto = new frmFoto();
            //ofrmFoto.ShowDialog();
        }

        private void cbEmpresa_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 13)
                SendKeys.Send("{TAB}");
            else
                e.KeyChar = char.ToUpper(e.KeyChar);
        }

        private void cbCargo_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.KeyChar = char.ToUpper(e.KeyChar);
        }

        private void cbVisitado_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.KeyChar = char.ToUpper(e.KeyChar);
        }

        private void cbUbicacion_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.KeyChar = char.ToUpper(e.KeyChar);
        }

        private void cbArea_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.KeyChar = char.ToUpper(e.KeyChar);
        }

        private void cbEmpresa_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode  == Keys.Enter)
                SendKeys.Send("{TAB}");

        }

        private void cbCargo_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
                SendKeys.Send("{TAB}");

        }

        private void cbVisitado_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
                SendKeys.Send("{TAB}");

        }

        private void cbUbicacion_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
                SendKeys.Send("{TAB}");

        }

        private void cbArea_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
                SendKeys.Send("{TAB}");

        }

        private void tbNumDoc_TextChanged(object sender, EventArgs e)
        {

        }

        private void cbVisitado_TextChanged(object sender, EventArgs e)
        {
            BUSVisitado objBUS = new BUSVisitado(Constantes.CADENA_BD);
            Visitado elem = objBUS.get(cbVisitado.Text);
            if (cbUbicacion.Text != null)
                cbUbicacion.Text = elem.ubicacion;

            if (cbArea.Text != null)
                cbArea.Text = elem.area;

        }

        private void ckbVisita_CheckedChanged(object sender, EventArgs e)
        {
            gbVisita.Enabled = ckbVisita.Checked;
        }


        
    }
}
